#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void Print(sigset_t pending)
{
    cout << "pid: " << getpid() << " pending: ";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void handler(int signo)
{
    cout << signo << "号信号被递达--";

    sigset_t pending;
    sigpending(&pending);
    Print(pending);
}

int main()
{
    // 阻止2号信号使进程退出
    signal(2, handler);

    // 栈上我们想要阻塞的信号
    sigset_t block;
    sigfillset(&block);
    // sigemptyset(&block);
    // sigaddset(&block, 2);

    // 设置进入内核
    sigprocmask(SIG_SETMASK, &block, nullptr);

    // 打印Pending表信息
    int cnt = 0;
    while (true)
    {
        cnt++;

        sigset_t pending;
        sigpending(&pending);

        Print(pending);
        sleep(1);

        //解除对2号信号的屏蔽
        //if(cnt == 20) sigprocmask(SIG_UNBLOCK,&pending,nullptr);
    }

    return 0;
}